import argparse
from util import util
import logging


def print_options_with_logging(opt):
    """
    使用logging模块将命令行参数打印到控制台
    :param opt: 命令行参数对象
    :return: None
    :author: qms, chaoshangcs(github)
    """
    args = dict((name, getattr(opt, name)) for name in dir(opt)
                if not name.startswith('_'))  # 获取命令行参数字典
    # dir()函数返回一个包含字符串的list，这些字符串是对象的属性和方法的名称
    # getattr()函数返回一个对象的属性值
    logging.info('------------ Options -------------')
    for k, v in sorted(args.items()):
        logging.info('%s: %s' % (str(k), str(v)))
    logging.info('-------------- End ----------------')


class BaseOptions:
    """
    处理命令行参数类
    :author: chaoshangcs(github), qms
    """

    def __init__(self):
        """
        初始化，定义命令行参数
        :param self: self
        :return: None
        :author: chaoshangcs(github), qms
        """
        self.parser = argparse.ArgumentParser()  # 创建一个ArgumentParser对象，用来保存命令行参数
        self.parser.add_argument('--save_dir', type=str, default='./results',
                                 help='models are saved in this directory')
        self.parser.add_argument('--exp_name', type=str, default='experiment_name_'+util.get_now_time(),
                                 help='name of the experiment. It decides where to store samples and models')
        self.parser.add_argument('--msvd_data_path', type=str, default='./data/msvd',
                                    help='path to msvd dataset')
        self.parser.add_argument('--gpu_id', type=int, default=0, help='gpu id for training and testing')
        self.parser.add_argument('--random_seed', type=int, default=666, help='random seed for generating random numbers')
        self.parser.add_argument('--resnext101_pretrained_path', type=str, default='./data/resnext-101-kinetics.pth',
                                 help='path to resnet101 model')
        self.parser.add_argument('--num_clips', default=8, type=int, help='number of clips')
        self.parser.add_argument('--image_height', default=224, type=int, help='image height')## y
        self.parser.add_argument('--image_width', default=224, type=int, help='image width') ## y
        self.parser.add_argument('--video_dir', type=str, default='./data/msvd-qa/video',
                                help='video directory')
        self.parser.add_argument('--video_name_mapping', type=str, default='./data/msvd-qa/youtube_mapping.txt', 
                                help='video name mapping file')
        self.parser.add_argument('--num_frames_per_clip', default=16, type=int, help='number of frames per clip')## y
        self.parser.add_argument('--vocab_json', type=str, default='./data/msvd-qa/msvd-qa_vocab.json', 
                                help='vocab json file')
        self.parser.add_argument('--batch_size', default=4, type=int, help='batch size') ## y
        self.parser.add_argument('--num_of_nodes', default=8, type=int, help='number of nodes')
        self.parser.add_argument('--beta', default=1e-8, type=float, help='optional loss parameter')
        self.parser.add_argument('--alpha', default=1, type=float, help='optional loss parameter')
        self.parser.add_argument('--is_video_preprocessed', default=False, type=bool, help='whether to preprocess video')
        # 在这里定义其他命令行参数

    def parse(self):
        """
        处理命令行参数
        :param self: self
        :return: opt: 命令行参数对象
        :author: chaoshangcs(github), qms
        """
        return self.parser.parse_args()  # 获取命令行参数
